﻿using Father;
using Person;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

/*
 * 继承
 *      描述了class之间的关系，is a 的关系
 *      
 *      特点： 子类可以使用父类的非私有成员
 *      
 *      父类：基类
 *            是一个大的类型，封装了本类型通用的成员变量/成员方法，直接被子类继承使用
 *      
 *      子类：派生类
 *            是一个特殊的类（特例的类），封装了本子类型独有的成员变量/成员方法
 *            
 *            
 * 继承当中的成员变量与成员方法访问规则：
 * 
 *       1 如果成员变量的名字与父类变量相同，则直接使用的时候采用子类的变量，父类变量隐藏
 *       
 *          -trick:如果你是故意在子类中声明父类同名变量，加一个new表示你是有意而为之
 *          
 *          -trick:如果在子类中想要访问父类中的同名变量，可以加 base.变量名
 *          
 *       2 如果成员方法的签名(名字)与父类方法签名(名字)相同，则直接访问的时候采用子类的方法，父类方法隐藏
 *       
 *          -trick:如果你是故意在子类中声明父类相同签名(名字)方法，加一个new表示你是有意而为之
 *          
 *          -trick:如果在子类中想要访问父类中的相同签名(名字)方法，可以加 base.方法名();
 *          
 *          -trick:如果在子类中声明的方法签名(名字)与父类相同，但参数不同，且构成重载，则不会隐藏父类方法
 */
namespace Person
{
    class Person
    {
        public int id = 0;
        public string name = "";
        public int age = 0;
    }
    class Student : Person
    {
        public void Learn()
        {
            Console.WriteLine("学生学习中.....");
        }
    }
    class Teacher : Person
    {
        public void Work()
        {
            Console.WriteLine("老师上课中.....");
        }
    }
}

namespace Father
{
    class Father
    {
        public int age = 30;

        public void say()
        {
            Console.WriteLine("Father");
        }
    }
    class Son : Father
    {
        new public int age = 10;
        public void Test()
        {
            Console.WriteLine(age);

            Console.WriteLine(base.age);
        }
        public void say(string words)
        {

            Console.WriteLine("Son " + words);
        }

        //new public void say()
        //{
        //    base.say();

        //    Console.WriteLine("Son");
        //}
    }
}

namespace 面向对象_继承
{
    //宠物类，作为猫与狗类型的父类
    class Pet
    {
        //非私有类型
        public string name = "";
        public int age = 0;

        public void Eat()
        {
            Console.WriteLine(name + "吃饭了！");
        }
    }

    class Cat:Pet
    {
        public void speak()
        {
            Console.WriteLine("Miao~");
        }
        public void CatchMouse()
        {
            Console.WriteLine("捉老鼠了！");
        }
    }
    class Dog : Pet
    {
        public void speak()
        {
            Console.WriteLine("Wang!");
        }
    }

    internal class Program
    {
        static void Main(string[] args)
        {
            Cat cat = new Cat();
            cat.name = "xxx";
            cat.age = 1;
            cat.Eat();

            Dog dog = new Dog();
            dog.name = "xxxl";
            dog.age = 2;
            dog.Eat();

            Student student = new Student();
            student.name = "小明";
            student.Learn();

            Teacher teacher = new Teacher();
            teacher.name = "王老师";
            teacher.Work();

            Son son = new Son();
            son.Test();
            son.say();
            son.say("你好");


            Console.Read();
        }
    }
}
